#!/usr/bin/env python3
"""
Windows数据库问题修复工具

解决Windows平台下SQLite数据库锁定问题
"""

import os
import sys
import time
import sqlite3
import platform
from pathlib import Path

def fix_windows_database():
    """修复Windows数据库问题"""
    try:
        print("🔧 Windows数据库问题修复工具")
        print(f"平台: {platform.platform()}")
        print(f"系统: {platform.system()}")
        
        # 检查数据库文件
        db_path = Path("data/mixvideo.db")
        
        if not db_path.parent.exists():
            print(f"📁 创建数据目录: {db_path.parent}")
            db_path.parent.mkdir(parents=True, exist_ok=True)
        
        print(f"📊 数据库路径: {db_path.absolute()}")
        print(f"数据库存在: {db_path.exists()}")
        
        if db_path.exists():
            print(f"文件大小: {db_path.stat().st_size} 字节")
        
        # 检查数据库锁定状态
        print(f"\n🔍 检查数据库锁定状态...")
        
        # 方法1: 尝试直接连接
        try:
            conn = sqlite3.connect(str(db_path), timeout=30)
            cursor = conn.cursor()
            
            # 测试基本操作
            cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
            tables = cursor.fetchall()
            print(f"✅ 数据库连接成功，找到 {len(tables)} 个表")
            
            # 检查WAL文件
            wal_file = db_path.with_suffix('.db-wal')
            shm_file = db_path.with_suffix('.db-shm')
            
            if wal_file.exists():
                print(f"⚠️  发现WAL文件: {wal_file}")
                print(f"WAL文件大小: {wal_file.stat().st_size} 字节")
            
            if shm_file.exists():
                print(f"⚠️  发现SHM文件: {shm_file}")
                print(f"SHM文件大小: {shm_file.stat().st_size} 字节")
            
            # 切换到DELETE模式
            print(f"\n🔧 切换到DELETE模式...")
            cursor.execute("PRAGMA journal_mode=DELETE")
            result = cursor.fetchone()
            print(f"Journal模式: {result[0]}")
            
            # 设置其他PRAGMA
            cursor.execute("PRAGMA synchronous=OFF")
            cursor.execute("PRAGMA busy_timeout=30000")
            
            conn.commit()
            conn.close()
            
            print(f"✅ 数据库配置已优化")
            
        except sqlite3.OperationalError as e:
            if "database is locked" in str(e):
                print(f"❌ 数据库被锁定: {e}")
                print(f"\n🔧 尝试修复...")
                
                # 方法2: 删除WAL和SHM文件
                wal_file = db_path.with_suffix('.db-wal')
                shm_file = db_path.with_suffix('.db-shm')
                
                files_removed = []
                
                if wal_file.exists():
                    try:
                        wal_file.unlink()
                        files_removed.append("WAL")
                        print(f"🗑️  删除WAL文件")
                    except Exception as e:
                        print(f"❌ 删除WAL文件失败: {e}")
                
                if shm_file.exists():
                    try:
                        shm_file.unlink()
                        files_removed.append("SHM")
                        print(f"🗑️  删除SHM文件")
                    except Exception as e:
                        print(f"❌ 删除SHM文件失败: {e}")
                
                if files_removed:
                    print(f"✅ 已删除 {', '.join(files_removed)} 文件")
                    
                    # 重新尝试连接
                    print(f"🔄 重新尝试连接...")
                    time.sleep(2)
                    
                    try:
                        conn = sqlite3.connect(str(db_path), timeout=30)
                        cursor = conn.cursor()
                        cursor.execute("PRAGMA journal_mode=DELETE")
                        cursor.execute("PRAGMA synchronous=OFF")
                        conn.commit()
                        conn.close()
                        print(f"✅ 数据库修复成功")
                    except Exception as e2:
                        print(f"❌ 修复后仍然失败: {e2}")
                        return False
                else:
                    print(f"❌ 无法修复数据库锁定问题")
                    return False
            else:
                print(f"❌ 数据库错误: {e}")
                return False
        
        # 方法3: 创建新的数据库文件
        if not db_path.exists():
            print(f"\n📝 创建新的数据库文件...")
            
            conn = sqlite3.connect(str(db_path))
            cursor = conn.cursor()
            
            # 设置Windows友好的配置
            cursor.execute("PRAGMA journal_mode=DELETE")
            cursor.execute("PRAGMA synchronous=OFF")
            cursor.execute("PRAGMA foreign_keys=ON")
            cursor.execute("PRAGMA cache_size=10000")
            cursor.execute("PRAGMA temp_store=MEMORY")
            cursor.execute("PRAGMA busy_timeout=30000")
            
            conn.commit()
            conn.close()
            
            print(f"✅ 新数据库文件创建成功")
        
        # 测试应用程序启动
        print(f"\n🚀 测试应用程序启动...")
        
        try:
            # 添加项目根目录到Python路径
            project_root = Path(__file__).parent
            sys.path.insert(0, str(project_root))
            
            from src.bootstrap import register_core_services, load_configuration
            
            print("🔧 初始化依赖注入容器...")
            load_configuration()
            register_core_services()
            
            print("✅ 应用程序初始化成功")
            return True
            
        except Exception as e:
            print(f"❌ 应用程序初始化失败: {e}")
            return False
        
    except Exception as e:
        print(f"❌ 修复工具执行失败: {e}")
        import traceback
        traceback.print_exc()
        return False

def create_windows_config():
    """创建Windows专用配置"""
    config_content = """
# Windows专用数据库配置
database:
  path: "data/mixvideo.db"
  echo: false
  pool_size: 1
  max_overflow: 0
  pool_timeout: 30
  pool_recycle: 3600
  
  # Windows专用SQLite配置
  sqlite_options:
    journal_mode: "DELETE"  # 避免WAL锁定问题
    synchronous: "OFF"      # 提高性能
    busy_timeout: 30000     # 30秒超时
    cache_size: 10000
    temp_store: "MEMORY"
    foreign_keys: "ON"
"""
    
    config_path = Path("config_windows.yaml")
    with open(config_path, 'w', encoding='utf-8') as f:
        f.write(config_content.strip())
    
    print(f"✅ 创建Windows配置文件: {config_path}")

if __name__ == "__main__":
    print("🔧 Windows数据库问题修复工具")
    print("=" * 50)
    
    # 创建Windows配置
    create_windows_config()
    
    # 修复数据库问题
    success = fix_windows_database()
    
    print("\n" + "=" * 50)
    if success:
        print("🎉 修复完成！现在可以尝试运行应用程序")
        print("\n建议:")
        print("1. 使用 python run_gui.py 启动应用")
        print("2. 如果仍有问题，请重启命令行窗口")
        print("3. 确保没有其他程序占用数据库文件")
    else:
        print("❌ 修复失败！")
        print("\n建议:")
        print("1. 检查文件权限")
        print("2. 关闭所有可能使用数据库的程序")
        print("3. 重启计算机后重试")
        print("4. 考虑使用本地Windows路径而不是WSL路径")
